var createError = require("http-errors");
var express = require("express");
var path = require("path");
var cookieParser = require("cookie-parser");
var logger = require("morgan");
const JWT = require('./utils/JWT');

var indexRouter = require("./routes/index");
var usersRouter = require("./routes/users");
var loginRouter = require("./routes/login");
var uploadRouter = require("./routes/upload");

var app = express();

// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");

app.use(logger("dev"));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, "public")));


// 全局的 页面 和 接口 中间件
app.use((req, res, next) => {
  // console.log(req.url, req.session);
  /**
   * 本项目中 登录界面 和 登录接口都包含 login 所以只需要判断存在login则
   *  */
  if (req.url.includes("login")) {
    next();
    // 前端手动跳转到 /login  无法拦截到 /  因为无任何请求 后端无法感知
    // if(req.url === '/login' && req.session.peson) {
    //   redirect('/')
    // }
    return;
  }
  // 先拿到头部token
  const token = req.headers.authorization?.split(' ')[1];
  if(token) {   // 是接口
    // 对token进行解密 判断是否在有效期
    const data = JWT.decode(token);
    if(data) {
      // 有效的话 重新生成token让前端存本地
      let token = JWT.encode({
        _id: data._id,
        username: data.username
      }, '1h')
      res.header('authorization', token);  // 接口从头部返回token
      next()
    } else {
      // 失效则报错  让前端清除token并导向到 /login 页面
      res.status(401).send({status:'err', message: 'token过期'})
    }
  } else {   // 是页面
    // 当是页面的时候  '/'  的时候直接放行
    next()
  }
});

app.use("/", indexRouter);
app.use("/api", usersRouter);
app.use("/login", loginRouter);
app.use("/upload", uploadRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render("error");
});

module.exports = app;
